package pl.edu.pw.elka.tinyrepo.gate.server;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;

import pl.edu.pw.elka.tinyrepo.common.CatalogContent;
import pl.edu.pw.elka.tinyrepo.common.CatalogContentSerializer;
import pl.edu.pw.elka.tinyrepo.common.HTTPHeaderType;
import pl.edu.pw.elka.tinyrepo.common.Request;
import pl.edu.pw.elka.tinyrepo.common.RequestHandler;
import pl.edu.pw.elka.tinyrepo.common.Response;
import pl.edu.pw.elka.tinyrepo.common.StatusCode;
import pl.edu.pw.elka.tinyrepo.common.exceptions.WrongPathException;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.CatalogDescriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.Descriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.FileDescriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.RepoDescriptor;
import sun.security.provider.certpath.OCSPResponse.ResponseStatus;


/**
 * @author: Kajot
 */

class DELETERequestHandler extends GateRequestHandler {
   
   public DELETERequestHandler(RepoDescriptor desc) {
      super(desc);
   }
   
   @Override
   public void run() {
      OutputStream out = null;
      try {
    	  
          out = incomming.getOutputStream(); // wyjscie do klienta
          String requestPath = request.getPath();

          Descriptor d = desc.getFileOrDirectoryDesc(requestPath);
          
          // DELETE pliku
          if(d.getClass() == FileDescriptor.class) 
          { 
        	  
             FileDescriptor fd = (FileDescriptor)d;
             
             Response rs = new Response(StatusCode.MOVED_PERMANENTLY); // wyslamy info ze plik jest gdzies indziej
             rs.addHeader(HTTPHeaderType.LOCATION, fd.getDestination()+"/"+fd.getId()); // wrzucenie do respone info o miejscu pliku i o ID PLIKU
             rs.write(out);
             System.out.println("Sent response: \n"+rs);
             
             System.out.println("Redirected "+incomming+" to: "+fd.getDestination()+"/"+fd.getId());

             // usuniecie pliku z logiki bramy
             // TODO usuwanie odbywa sie w ten sposob czy poprzez callback z DS?
//             desc.removeFileOrDirectoryDesc(requestPath); <- poprzez callback z DS
             
             return;
             
          }

          // DELETE folderu
          if(d.getClass() == CatalogDescriptor.class) 
          {
             desc.removeFileOrDirectoryDesc(requestPath); // usuwa z repozytorium i z poszczegolnych dsow
             Response res = new Response(StatusCode.OK);
         	 res.write(out);  
         	 System.out.println("Sent response: \n"+res);
         	 return;
         	 
          }
         
      }catch (FileNotFoundException e) { // pliku nie ma
         e.printStackTrace();
         Response rs = new Response(StatusCode.NOT_FOUND);
         rs.write(out);
      }
      catch (WrongPathException e) { // nieprawidlowa sciezka do pliku
         e.printStackTrace();
         Response rs = new Response(StatusCode.FORBIDDEN);
         rs.write(out);
      }
      catch (IOException e) {
         // cos nie tak z polaczeniem, nic nie wysylaj, wyswietl info na serwerze
         e.printStackTrace();
      }
      // socket jest zamykany w klasach DAVServer
   }


   @Override
   public RequestHandler copy() {
      return new DELETERequestHandler(desc);
   }
}


